\chapter{Entrega 1: Tecnologías utilizadas y Definición de estado y acción}

\section{Tecnologías}
\subsection{Lenguaje de programación}
El lenguaje elegido para la realización de la práctica es \emph{Java} dado que es ampliamente conocido, tiene un manejo simple de todo tipo de estructuras de datos, es escalable y existen IDEs que ayudan al programador con el trabajo. Además cuenta con gran cantidad de librerías para solucionar casi cualquier tipo de problema.\newline
Una de las posibles pegas que tiene es que tiene un manejo automático de la memoria, y no permite que el programador se encargue de ello. Me refiero a ello como ``posible pega'' porque en términos generales esto sirve para ayudar al programador, pero quizás por esta característica, el lenguaje no sirva para este problema en particular. Se comentará con el profesor.

\subsection{Librería Gráfica}
La librería principal a utilizar es \emph{awt}, que por sí sola permite un manejo de imágenes adecuado para el problema (leer el color de un pixel). Aún así, se propone la utilización de otras librerias gráficas que amplian las capacidades de \emph{awt}, por si el problema lo requiere:
\begin{itemize}
	\item \textbf{Java 2D}: Permite trabajar entre otras cosas con lineas, texto, imagenes, formas, \ldots, permitiendo operaciones como la 
		rotación, el escalado, \ldots. Siempre, como su nombre indica, trabajando en dos dimensiones.
	\item \textbf{Java Advanced Imaging (JAI)}: Proporciona un conjunto de interfaces para el tratamiento avanzado de imágenes, incluyendo 
		distintas operaciones de procesamiento. Su forma de trabajar es la siguiente: funciona como un grafo, primero se obtienen las 
		imagenes y despues se relacionan entre si por medio de las operaciones. Finalmente se evalúa el grafo y obtenemos la imagen resultado. 
		Las operaciones de procesado que ofrece se dividen en varias categorías: Operadores de Punto, de Area, Geométricos, de cuantización de 
		color, de archivo, de frecuencia, estadísticos, de extracción de bordes y misceláneos.
	\item \textbf{ImageJ}: Sirve para el tratamiento de imágenes con una buena velocidad y contiene un buen número de operaciones, que además 
		puede ser ampliado mediante plug-ins desarrollados por terceros. Permite situar sobre la imagen pixeles según sus coordenadas.
	\item \textbf{NeatVision}: Se trata de un software de gran calidad para el procesado de imágenes, destinado sobre todo al usuario final. 
		Opera de la misma manera que el anterior, es decir, el usuario va creando gráficamente en su entorno de trabajo un grafo que representa 
		las operaciones que se van a efectuar con las imágenes. La diferencia es que NeatVision sí implementa por sí mismoun gran número de 
		operaciones.
\end{itemize}


\section{Problema de Espación de Estados Simple}
\subsection{Definición de Estado}
Un estado estará compuesto por:
\begin{itemize} 
	\item \textbf{Píxel Actual}: Posición del píxel a procesar.
	\item \textbf{Ficha Colocada}: Ficha colocada en la posición del píxel actual.
\end{itemize}

\subsection{Operaciones}
Las operaciones que se podrán realizar sobre un estado son:
\begin{itemize}
	\item \textbf{Poner una recta (pieza 1)}: Provoca que el próximo píxel a procesar sea el adyacente, conservando la misma dirección y sentido.
	\item \textbf{Poner una recta doble (pieza 2)}: Provoca que el próximo píxel a procesar sea el vecino del adyacente, conservando la misma 
		dirección y sentido. Esto provoca que haya que sumar el coste de pasar por el píxel adyacente.
	\item \textbf{Poner una curva (pieza 3)}: Provoca que el próximo píxel a procesar sea el adyacente, cambiando de dirección. Según la 
		coloquemos, el sentido será uno u otro.
\end{itemize}

\subsection{Altenartivas de codificación, identificación y almacenamiento}


\section{Estructuras Necesarias}
La estructura de datos a utilizar sería alguna con las propiedades del \textbf{montículo}, pero ampliando la capacidad para que no sea un árbol binario, ya que dado un nodo estado, existen más de dos hijos para el problema planteado.\newline
El montículo por si solo es un conjunto ordenado válido para implementar colas con prioridad, con sus operaciones de inserción y eliminación, que por ser sobre un montículo se convierten en operaciones muy eficientes para el recorrido de grafos. 
Además, como se trata de un árbol completo\footnote{Todos los niveles están llenos excepto el último}, se puede implementar con arrays, lo cual simplifica su codificación y libera al programador del uso de punteros. Esto permitirá dividir el array para poder llevar parte del mismo a disco si no cabe en memoria.
